def create_insoutb_model():
model = Model()
model.set_var_default(0)
model.var('Ad', desc='Demand for Central bank advances from commercial banks')
model.var('As', desc='Supply of central bank advances to commercial banks')
model.var('Bbd', desc='Government bills demanded by commercial banks')
model.var('Bbdn', desc='Notional demand for government bills from commercial banks')
model.var('Bcb', desc='Government bills held by Central bank')
model.var('Bhd', desc='Demand for government bills')
model.var('Bhh', desc='Government bills held by households')
model.var('Bs', desc='Supply of government bills')
model.var('BLd', desc='Demand for government bonds')
model.var('BLh', desc='Demand for government bonds')
model.var('BLs', desc='Supply of government bonds')
model.var('BLR', desc='Gross bank liquidity ratio')
model.var('BLRn', desc='Net bank liquidity ratio')
model.var('BPM', desc="Banks' profit margin")
model.var('Ck', desc='Real consumption')
model.var('CG', desc='Capital gains on government bonds')
model.var('CONS', desc='Consumption at current prices')
model.var('F', desc='Realized profits of firms and banks')
model.var('Fb', desc='Realized profits of firms and banks')
model.var('Fcb', desc='Central bank "profits"')
model.var('Ff', desc='Realized firm profits')
model.var('Ffe', desc='Expected profits of firms')
model.var('G', desc='Government expenditures')
model.var('Hbd', desc='Cash required by banks')
model.var('Hbs', desc='Cash supplied to banks')
model.var('Hhd', desc='Household demand for cash')
model.var('Hhh', desc='Cash held by households')
model.var('Hhs', desc='Cash supplied by households')
model.var('Hs', desc='Total supply of cash')
model.var('IN', desc='Stock of inventories at current costs')
model.var('INk', desc='Real inventories')
model.var('INke', desc='Expected real inventories')
model.var('INkt', desc='Target level of real inventories')
model.var('Ld', desc='Demand for loans')
model.var('Ls', desc='Supply of loans')
model.var('M1h', desc='Checking deposits held by households')
model.var('M1hn', desc='Notional holding of checking deposits')
model.var('M1s', desc='Checking deposits supplied by banks')
model.var('M2d', desc='Demand for term deposits - constrained to be non-negative')
model.var('M2h', desc='Term deposits held by households')
model.var('M2s', desc='Term deposits supplied by banks')
model.var('N', desc='Employment level')
model.var('NHUC', desc='Normal historic unit costs')
model.var('omegat', desc='Target real wage for workers')
model.var('P', desc='Price level')
model.var('Pbl', desc='Price of government bonds')
model.var('PI', desc='Price inflation')
model.var('PSBR', desc='Government deficit')
model.var('Ra', desc='Interest rate on Central bank advances')
model.var('Rb', desc='Interest rate on government bills')
model.var('Rbl', desc='Interest rate on bonds')
model.var('Rl', desc='Interest rate on loans')
model.var('Rm', desc='Interest rate on deposits')
model.var('RRb', desc='Real interest rate on bills')
model.var('RRbl', desc='Real interest rate on long term bonds')
model.var('RRl', desc='Real interest rate on loans')
model.var('RRm', desc='Real interest rate on term deposits')
model.var('S', desc='Sales at current prices')
model.var('Sk', desc='Real sales')
model.var('Ske', desc='Expected real sales')
model.var('sigmas', desc='Realized inventories to sales ratio')
model.var('sigmat', desc='Target inventories to sales ratio')
model.var('T', desc='Taxes')
model.var('UC', desc='Unit costs')
model.var('V', desc='Wealth of households')
model.var('Ve', desc='Expected household wealth')
model.var('Vk', desc='Real wealth of households')
model.var('Vnc', desc='Wealth of households, net cash')
model.var('Vnce', desc='Expected wealth of households, net cash')
model.var('WB', desc='The wage bill')
model.var('Y', desc='Output at current prices')
model.var('Yk', desc='Real output')
model.var('YDhs', desc='Haig-Simons measure of disposable income')
model.var('YDkhs', desc='Haig-Simons measure of real disposable income')
model.var('YDkr', desc='Regular real disposable income')
model.var('YDkre', desc='Expected regular real disposable income')
model.var('YDr', desc='Regular disposable income')
model.var('YDre', desc='Expected regular disposable income')
model.set_param_default(0)
model.param('alpha0', desc='Autonomous consumption')
model.param('alpha1', desc='Propensity to consume out of income')
model.param('alpha2', desc='Propensity to consume out of wealth')
model.param('beta', desc='Parameter in expectation formations on real sales')
model.param('bot', desc='Bottom value for bank net liquidity ratio')
model.param('botpm', desc='Bottom value for bank profit margin')
model.param('eps', desc='Parameter in expectation formations on real disposable income')
model.param('gamma', desc='Speed of adjustment of inventories to the target level')
model.param('lambda20', desc='Parameter in household demand for time deposits')
model.param('lambda21', desc='Parameter in household demand for time deposits')
model.param('lambda22', desc='Parameter in household demand for time deposits')
model.param('lambda23', desc='Parameter in household demand for time deposits')
model.param('lambda24', desc='Parameter in household demand for time deposits')
model.param('lambda25', desc='Parameter in household demand for time deposits')
model.param('lambda30', desc='Parameter in household demand for bills')
model.param('lambda31', desc='Parameter in household demand for bills')
model.param('lambda32', desc='Parameter in household demand for bills')
model.param('lambda33', desc='Parameter in household demand for bills')
model.param('lambda34', desc='Parameter in household demand for bills')
model.param('lambda35', desc='Parameter in household demand for bills')
model.param('lambda40', desc='Parameter in household demand for bonds')
model.param('lambda41', desc='Parameter in household demand for bonds')
model.param('lambda42', desc='Parameter in household demand for bonds')
model.param('lambda43', desc='Parameter in household demand for bonds')
model.param('lambda44', desc='Parameter in household demand for bonds')
model.param('lambda45', desc='Parameter in household demand for bonds')
model.param('lambdac', desc='Parameter in household demand for cash')
model.param('phi', desc='Mark-up on unit costs')
model.param('ro1', desc='Reserve requirements parameter')
model.param('ro2', desc='Reserve requirements parameter')
model.param('sigma0', desc='Parameter determining the target inventories to sales ratio')
model.param('sigma1', desc='Parameter linking the target inventories to sales ratio to the interest rate')
model.param('tau', desc='Sales tax rate')
model.param('top', desc='Top value for bank net liquidity ratio')
model.param('toppm', desc='Top value for bank profit margin')
model.var('z1', desc='Is 1 if bank checking accounts are non-negative')
model.var('z2', desc='Is 1 if bank checking accounts are negative')
model.var('z3', desc='Is 1 if banks net liquidity ratio is below bottom level')
model.var('z4', desc='Is 1 if banks net liquidity ratio was below bottom level')
model.var('z4b', desc='Is 1 if banks net liquidity ratio was way below bottom level')
model.var('z5', desc='Is 1 if banks net liquidity ratio was above top level')
model.var('z5b', desc='Is 1 if banks net liquidity ratio was way above top level')
model.var('z6', desc='Is 1 if banks profit margin is below bottom level')
model.var('z7', desc='Is 1 if banks profit margin is above top level')
model.param('xib', desc='Parameter in the equation for setting interest rate on deposits')
model.param('xil', desc='Parameter in the equation for setting interest rate on loans')
model.param('xim', desc='Parameter in the equation for setting interest rate on deposits')
model.param('omega0', desc='Parameter influencing the target real wage for workers')
model.param('omega1', desc='Parameter influencing the target real wage for workers')
model.param('omega2', desc='Parameter influencing the target real wage for workers')
model.param('omega3', desc='Speed of adjustment of wages to target value')
model.param('ERrbl', desc='Expected rate of return on long term bonds')
model.param('Gk', desc='Real government expenditures')
model.param('Nfe', desc='Full employment level')
model.param('PR', desc='Labour productivity')
model.param('Rbbar', desc='Interest rate on bills, set exogenously')
model.param('Rblbar', desc='Interest rate on bonds, set exogenously')
model.var('W', desc='Wage rate')
# Box 10.1 Firms' decisions
# -------------------------
model.add('Yk = Ske + INke - INk(-1)') # 10.1 : Real output
model.add('N = Yk/PR') # 10.2 : Employment
model.add('WB = N*W') # 10.3 : The wage bill
model.add('UC = WB/Yk') # 10.4 : Unit costs
model.add('Ske = beta*Sk(-1) + (1-beta)*Ske(-1)') # 10.5 : Expected real sales
model.add('INkt = sigmat * Ske') # 10.6 : Target level of real inventories
model.add('sigmat = sigma0 - sigma1*Rl') # 10.7 : Target inventories to sales ratio
model.add('RRl = (1 + Rl)/(1 + PI) - 1') # 10.8 : Real interest rate on loans
model.add('INke = INk(-1) + gamma*(INkt - INk(-1))') # 10.9 : Expected real inventories
model.add('NHUC = (1 - sigmat)*UC + sigmat*(1 + Rl(-1))*UC(-1)') # 10.11 : Normal historic unit costs
model.add('P = (1 + tau)*(1 + phi)*NHUC') # 10.10 : Price level
model.add('Ffe = (phi/(1+phi))*(1/(1+tau))*P*Ske') # 10.11A : Expected profits of firms
# Box 10.2 : Firms' equations
# ---------------------------
model.add('Sk = Ck + Gk') # 10.12 : Real sales
model.add('S = P * Sk') # 10.13 : Sales at current prices
model.add('INk - INk(-1) = Yk - Sk') # 10.14 : Real inventories
model.add('sigmas = INk(-1)/Sk') # 10.15 : Realized inventories to sales ratio
model.add('IN = INk*UC') # 10.16 : Stock of inventories
model.add('Ld = IN') # 10.17 : Demand for loans
model.add('Ff = S - T - WB + IN - IN(-1) - Rl(-1)*IN(-1)') # 10.18 : Firms realized profits
model.add('PI = P/P(-1) - 1') # 10.19 : Rate of price inflation
# Box 10.3 : Household equations
# ------------------------------
model.add('YDr = WB + F + Rm(-1)*M2d(-1) + Rb(-1)*Bhh(-1) + BLh(-1)') # 10.20 : Regular disposable income
model.add('CG = (Pbl - Pbl(-1))*BLh(-1)') # 10.21 : Capital gains on bonds
model.add('YDhs = YDr + CG') # 10.22 : Haig-Simons measure of disposable income
model.add('F = Ff + Fb') # 10.23 : Total net profits
model.add('V = V(-1) + YDhs - CONS') # 10.24 : Nominal wealth
model.add('Vnc = V - Hhd') # 10.25 : Nominal wealth net of cash
model.add('YDkr = (YDr - PI*V(-1))/P') # 10.26 : Real regular disposable income
model.add('YDkhs = (YDr - PI*V(-1) + CG)/P') # 10.27 : Real HS disposable income
model.add('Vk = V/P') # 10.28 : Real wealth of households
# Box 10.4 : Household equations
# ------------------------------
model.add('Ck = alpha0 + alpha1*YDkre + alpha2*Vk(-1)') # 10.29 : Consumption decision
model.add('YDkre = eps*YDkr(-1) + (1 - eps)*YDkre(-1)') # 10.30 : Expected real regular disposable income
model.add('CONS = Ck*P') # 10.31 : Consumption at current prices
model.add('YDre = P*YDkre + PI*V(-1)/P') # 10.32 : Expected regular disposable income
model.add('Ve = V(-1) + YDre - CONS') # 10.33 : Expected nominal wealth
model.add('Hhd = lambdac*CONS') # 10.34 : Household demand for cash
model.add('Vnce = Ve - Hhd') # 10.35 : Expected nominal wealth net of cash
# Box 10.5 : Households portfolio equations, based on nominal rates
# -----------------------------------------------------------------
# 10.37 : Demand for term banks deposit
model.add('M2d = (lambda20 + lambda22*Rm + lambda23*Rb + lambda24*ERrbl + lambda25*(YDre/Vnce))*Vnce')
# 10.38 : Demand for government bills
model.add('Bhd = (lambda30 + lambda32*Rm + lambda33*Rb + lambda34*ERrbl + lambda35*(YDre/Vnce))*Vnce')
# 10.39 : Demand for government bonds
model.add('BLd = (lambda40 + lambda42*Rm + lambda43*Rb + lambda44*ERrbl + lambda45*(YDre/Vnce))*Vnce/Pbl')
# Box 10.6 : Households portfoloio equations, based on real rates
# ---------------------------------------------------------------
# 10.37A : "Notional" Demand for term banks deposits
# M2d = (lambda20 - lambda21*PI/(1 + PI) + lambda22*RRm + lambda23*RRb + lambda24*RRbl + lambda25*YDre/Vnce))*Vnce
# 10.38A : Demand for government bills
# Bhd = (lambda30 - lambda31*PI/(1 + PI) + lambda32*RRm + lambda33*RRb + lambda34*RRbl + lambda35*YDre/Vnce))*Vnce
# 10.39A : Demand for government bonds
# BLd = (lambda40 - lambda41*PI/(1 + PI) + lambda42*RRm + lambda43*RRb + lambda44*RRbl + lambda45*YDre/Vnce))*Vnce/PIbl
model.add('RRm = (1 + Rm)/(1 + PI) - 1') # 10.37B : Real interest rate on term deposits
model.add('RRb = (1 + Rb)/(1+ PI) - 1') # 10.38B : Real interest rate on bills
model.add('RRbl = (1 + Rbl)/(1 + PI) - 1') # 10.39B : Real interest rate on long-term bonds
# Box 10.7 : Households equations, realized portfolio asset holding
# -----------------------------------------------------------------
model.add('Hhh = Hhd') # 10.40 : Cash holding
model.add('Bhh = Bhd') # 10.41 : Holding of bills
model.add('BLh = BLd') # 10.42 : Holding of bonds
model.add('M1hn = Vnc - M2d - Bhd - Pbl*BLd') # 10.43 : Notional holding of bank checking accounts
model.add('M1h = M1hn * z1') # 10.44 : Holding of bank checking accounts
model.add('z1 = if_true(M1hn >= 0)') # 10.45 : Condition for non-negative bank checking acounts
model.add('M2h = M2d*z1 + (Vnc - Bhh - Pbl*BLd)*z2') # 10.46 : Holding of bank term deposits
model.add('z2 = 1 - z1') # 10.47 : Condition for negative bank checking accounts
# Box 10.8 : Government equations
# -------------------------------
model.add('T = S*tau/(1 + tau)') # 10.48 : Tax receipts
model.add('G = P*Gk') # 10.49 : Government expenditures
model.add('PSBR = G + Rb(-1)*Bs(-1) + BLs(-1) - (T + Fcb)') # 10.50 : Government deficit
model.add('Bs - Bs(-1) = PSBR - (BLs - BLs(-1))*Pbl') # 10.51 : New issues of bills
model.add('BLs = BLd') # 10.52 : Supply of bonds
model.add('Pbl = 1/Rbl') # 10.53 : Price of bonds
model.add('Rbl = Rblbar + PI(-1)') # 10.54 : Yield on bonds is exogenous
# Box 10.9 : Central bank equations
# ---------------------------------
model.add('Hs = Bcb + As') # 10.55 : Supply of cash
model.add('Hbs = Hs - Hhs') # 10.56 : Supply of cash to commercial banks
model.add('Bcb = Bs - Bhh - Bbd') # 10.57 : CB purchases of government bills
model.add('Rb = Rbbar + PI(-1)') # 10.58 : Interest rate on government bills, set exogenously
model.add('As = Ad') # 10.59 : Supply of CB advances to commercial banks
model.add('Ra = Rb') # 10.60 : Interest rate on CB advances
model.add('Fcb = Rb(-1)*Bcb(-1) + Ra(-1)*As(-1)') # 10.61 : Profits of Central Bank
# Box 10.10 : Commercial bank equations
# -------------------------------------
model.add('Hhs = Hhd') # 10.62 : Supply of cash to households
model.add('M1s = M1h') # 10.63 : Supply of checking deposits
model.add('M2s = M2d') # 10.64 : Supply of time deposits
model.add('Ls = Ld') # 10.65 : Supply of loans
model.add('Hbd = ro1*M1s + ro2*M2s') # 10.66 : Demand for cash by banks (reserve requirement)
# Box 10.11 : Commercial bank equations
# -------------------------------------
model.add('Bbdn = M1s + M2s - Ls - Hbd') # 10.67 : Notional demand for bills
model.add('BLRn = Bbdn/(M1s + M2s)') # 10.68 : Net bank liquidity ratio
model.add('Ad = (bot*(M1s + M2s) - Bbdn)*z3') # 10.69 : Advances needed by banks
model.add('z3 = if_true(BLRn < bot)') # 10.70 : Check if net liquidity is above bottom value
model.add('Bbd = Ad + M1s + M2s - Ls - Hbd') # 10.71 : Demand for government bills
model.add('BLR = Bbd/(M1s + M2s)') # 10.72 : Gross bank liquidity ratio
# Box 10.12 : Commercial bank equations
# -------------------------------------
# 10.73 : Interest rate on deposits
model.add('Rm = Rm(-1) + 0.0001*z4 + 0.0002*z4b - 0.0001*z5 - 0.0002*z5b + xib*(Rb - Rb(-1))')
model.add('z4 = if_true(BLRn(-1) < bot)') # 10.75 : Check if net liquidity ratio was below bottom value
model.add('z4b = if_true(BLRn(-1) < (bot - 0.02))')
model.add('z5 = if_true(BLRn(-1) > top)') # 10.76 : Check if net liquidity ratio was above top value
model.add('z5b = if_true(BLRn(-1) > (top+0.02))')
# 10.77 : Realized bank profits
model.add('Fb = Rl(-1)*Ls(-1) + Rb(-1)*Bbd(-1) - Rm(-1)*M2s(-1) - Ra(-1)*Ad(-1)')
model.add('Rl - Rl(-1) = xil*(z6 - z7) + (Rb - Rb(-1))') # 10.78 : Interest rate on loans
model.add('z6 = if_true(BPM < botpm)') # 10.80 : Check if banks profit margin is below bottom value
model.add('z7 = if_true(BPM > toppm)') # 10.81 : Check if banks profit margin is above top value
model.add('BPM = (Fb + Fb(-1))/(M1s(-1) + M1s(-2) + M2s(-1) + M2s(-2))') # 10.82 : Banks profit margin
# Inflationary forces
# -------------------
# 10.84 : Target real wage for workers
model.add('omegat = exp(omega0 + omega1*log(PR) + omega2*log((N/Nfe)))')
model.add('W = W(-1)*(1 + omega3*(omegat(-1) - W(-1)/P(-1)))') # 10.85 Unit wages
# Addtional equations
# -------------------
model.add('Y = P*Sk + (INk - INk(-1))*UC') # Output at current prices
return model
insoutb_parameters = {'alpha0': 0,
'alpha1': 0.95,
'alpha2': 0.05,
'beta': 0.5,
'bot': 0.02,
'botpm': 0.002,
'eps': 0.5,
'gamma': 0.5,
'lambda20': 0.52245,
'lambda21': 20,
'lambda22': 40,
'lambda23': -20,
'lambda24': -20,
'lambda25': -0.06,
'lambda30': 0.47311,
'lambda31': 40,
'lambda32': -20,
'lambda33': 40,
'lambda34': -20,
'lambda35': -0.06,
'lambda40': 0.17515,
'lambda41': 20,
'lambda42': -20,
'lambda43': -20,
'lambda44': 40,
'lambda45': -0.06,
'lambdac': 0.1,
'phi': 0.1,
'ro1': 0.1,
'ro2': 0.1,
'sigma0': 0.3612,
'sigma1': 3,
'tau': 0.25,
'top': 0.04,
'toppm': 0.005,
'xib': 0.9,
'xil': 0.002,
'xim': 0.0002,
'omega0': -0.32549,
'omega1': 1,
'omega2': 1.5,
'omega3': 0.1}
insoutb_exogenous = {'Gk': 25,
'Nfe': 133.28,
'PR': 1,
'Rbbar': 0.023,
'Rblbar': 0.027,
'ERrbl': 0.027,
'W': 1}
insoutb_variables = [('Bbd', 1.19481),
('Bbdn', 1.19481),
('Bcb', 19.355),
('Bhh', 49.69136),
('Bhd', 'Bhh'),
('Bs', 70.24123),
('BLh', 1.12309),
('BLd', 'BLh'),
('BLs', 'BLd'),
('Hbd', 4.36249),
('Hbs', 'Hbd'),
('Hhd', 14.992),
('Hhh', 'Hhd'),
('Hhs', 'Hhd'),
('INk', 38.07),
('INke', 'INk'),
('IN', 38.0676),
('Ls', 38.0676),
('Ld', 'Ls'),
('M1s', 3.9482),
('M1h', 'M1s'),
('M1hn', 'M1s'),
('M2s', 39.667),
('M2d', 'M2s'),
('M2h', 'M2d'),
('Vk', 108.285),
('Ra', 0.02301),
('Rb', 0.02301),
('Rl', 0.02515),
('Rm', 0.02095),
('BLRn', 0.02737),
('Fb', 0.1535),
('P', 1.38469),
('Pbl', 37.06),
('Rbl', 'Rblbar'),
('Sk', 133.277),
('Ske', 'Sk'),
('UC', 1),
('YDkr', 108.28),
('YDkre', 108.28),
('V', 'Vk*P'),
('Ve' , 'V'),
('Vnc', 'V - Hhh'),
('Vnce', 'Vnc'),
('omegat', 0.72215)]